www.gusucode.com > XbPhp开发框架 v1.4.5PHP源码程序 > XbPhp开发框架 v1.4.5/xbphp/xbphp/XbPhp/route/App.php

    <?php
/**
 * 路由器与加载机制
 * @author wave
 */

class App 
{

	/**
	 * 每次初始化的执行加载和初始化
	 * @author wave
	 */
	public function __construct() {
		$params = self::getUrl();  //獲取URL參數數組
		$request = array(); //URL的参数
		$num = 0; //动态URL访问
		//动态的URL的路由器
		if(!isset($params['rewirte'])) {
			$params[M] = isset($params[M]) ? $params[M] : M_INDEX;
			$params[M] =  isset(config::$disableController) ? (in_array($params[M], config::$disableController) ? M_INDEX : $params[M]) : M_INDEX;
			$params[A] = isset($params[A]) ? $params[A] : A_INDEX;
			$controller = $params[M].'Controller.php';
			$action = $params[A];
		}else {  
			//伪静态的URL的路由器
			if(!empty($params)) {
				unset($params['rewirte']);
				$params['0'] = isset($params['0']) ? $params['0'] : M_INDEX;
				$params['0'] = isset(config::$disableController) ? (in_array($params['0'], config::$disableController) ? M_INDEX : $params['0']) : M_INDEX;
				$params['1'] = isset($params['1']) ? $params['1'] : A_INDEX;
				if(strpos($params['1'],'?') !== false) {
					$str = substr($params['1'],strpos($params['1'],'?'));
					$params['1'] = str_replace($str,'',$params['1']);
				}
				$controller = $params['0'].'Controller.php';
				$action = $params['1'];
				$num = 1;
			}	
		}

		//引入控制器,并初始化控制器
		if(!empty($action) && !empty($controller)) {
			if(load($controller,APP_PATH.DS.ROOT_CONTROLLER)) {
				$controller_name = isset($params[M]) ? $params[M] : $params['0'];
				$xb = Xbphp::run_cache($controller_name.'Controller');
			}

			if(isset($xb) && method_exists($xb,$action)) {
				$paramArr = self::replaceArr(array($controller_name,$action),'',$params);
				 $request = isset($params['params']) ? $params['params'] : $paramArr;
				 $_GET = !empty($_GET) ? array_merge($_GET,$request) : $_GET;

				$route = load('route.php',APP_PATH.DS.DATABASE.DS); //加载路由规则
				if(!empty($num) && isset($route['rewirte'][rtrim($controller,'Controller.php')][$action])) {
					$request = implode('/',$request);
					$arr = $this->route('rewirte',$request,$route,$controller,$action);
					$requestStr = isset($request[0]) ? $request[0] : '';
					$requestArr = explode('/', $requestStr);
					$keyArr = is_array($requestArr) ? array_diff($requestArr,$arr) : array();
					$_GET = !empty($keyArr) ?  array_merge($_GET,array_combine($keyArr, $arr)) : array_merge($_GET,$arr);
				}

				//动态url规则
				if(empty($num) && isset($route['trends'][rtrim($controller,'Controller.php')][$action])) {
					$this->route('trends',$request,$route,$controller,$action);
				}
				call_user_func_array(array($xb,$action),$request);
			}else {
				load('404.tpl',ROOT_PATH.DS.ROOT_ERROR.DS.'tpl'); 
				exit;
			}
		}else {
			load('404.tpl',ROOT_PATH.DS.ROOT_ERROR.DS.'tpl');
			exit;
		}
		//打开DEUG
		if(DEBUG) {
			self::debug();
		}
	}

	/**
	 * 设置路由规则
	 * @param string $op 
	 * @param Array $request 请求的参数
	 * @param Array $route 路由
	 * @param string $controller
	 * @param string $action
	 */
	protected function route($op,&$request,$route,$controller,$action) {
		if(empty($request))  {
			return '';
		}
		
		$request = ($op === 'rewirte') ?  $request : http_build_query($request);
		if(!isset($route[$op][rtrim($controller,'Controller.php')][$action])) {
			load('404.tpl',ROOT_PATH.DS.ROOT_ERROR.DS.'tpl');
		 	exit;
		}

		if(preg_match($route[$op][rtrim($controller,'Controller.php')][$action],$request,$arr)) {
			$request = array_values(array_filter(array_splice($arr,0,1)));
			return $arr;
		}else {
		 	load('404.tpl',ROOT_PATH.DS.ROOT_ERROR.DS.'tpl');
		 	exit;
		}
	}

	/**
	 * 获取GET的URL
	 * @return Array
	 * @author wave
	 */
	protected static function getUrl() {
		$pathinfo  = Xbphp::getServerUrl();
		if(empty($pathinfo)) {
			if(!empty($_GET) && isset($_GET[M]) && isset($_GET[A])) {
				$pArr =array_filter(self::replaceArr(array($_GET[M],$_GET[A]),'',$_GET));
				$params[M] = $_GET[M];
				$params[A] = $_GET[A];
				$params['params'] = $pArr; 
			}
		}else {
			$pathinfo['rewirte'] = true;
			$params = $pathinfo;
		}
		return !empty($params) ? $params : '';
	}


	/**
	 * debug方法
	 * @author wave
	 */
	protected static function debug() {
		$sqlArr = Cache::read('sql');
		$time = Cache::read('time');
		Cache::del('sql');
		require ROOT.DS.ROOT_PATH.DS.ROOT_ERROR.DS.'tpl'.DS.'iframe.tpl';
	}


	/**
	 * 替换函数
	 * @param Array or string $arr 要替换的值
	 * @param Array or string $rArr 被替换的值
	 * @param Array or string $params 要替换的数据
	 * @return Array or string 
	 * @author wave
	 */
	protected static function replaceArr($arr,$rArr,$params) {
		if(isset($arr) && !empty($params)) {
			return array_filter(str_replace($arr,$rArr, $params));
		}
	}
}